From 17acf34b9f791e3362444400b2d2ea19cbc1177e Mon Sep 17 00:00:00 2001 From: "mjw@wray-m-3.hpl.hp.com" Date: Wed, 18 Aug 2004 13:37:48 +0000 Subject: [PATCH] bitkeeper revision 1.1159.38.5 (41235bac45keyRYBSLnIxXITxalrzg) Add 'live' parameter to migrate. --- tools/python/xen/xend/XendClient.py | 7 ++++--- tools/python/xen/xend/XendDomain.py | 4 ++-- tools/python/xen/xend/XendMigrate.py | 15 ++++++++++----- tools/python/xen/xend/server/SrvDomain.py | 4 +++- tools/python/xen/xm/migrate.py | 6 +++++- tools/xfrd/xen_domain.c | 9 +++++++-- tools/xfrd/xen_domain.h | 5 ++++- tools/xfrd/xfrd.c | 16 ++++++++++++---- 8 files changed, 47 insertions(+), 19 deletions(-) diff --git a/tools/python/xen/xend/XendClient.py b/tools/python/xen/xend/XendClient.py index a5194fa748..5041e06cb7 100644 --- a/tools/python/xen/xend/XendClient.py +++ b/tools/python/xen/xend/XendClient.py @@ -480,10 +480,11 @@ class Xend: {'op' : 'save', 'file' : filename }) - def xend_domain_migrate(self, id, dst): + def xend_domain_migrate(self, id, dst, live=0): return self.xendPost(self.domainurl(id), - {'op' : 'migrate', - 'destination': dst }) + {'op' : 'migrate', + 'destination': dst, + 'live' : live }) def xend_domain_pincpu(self, id, cpu): return self.xendPost(self.domainurl(id), diff --git a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py index 7dead8f820..05eb28cbe8 100644 --- a/tools/python/xen/xend/XendDomain.py +++ b/tools/python/xen/xend/XendDomain.py @@ -586,7 +586,7 @@ class XendDomain: self.refresh_schedule() return val - def domain_migrate(self, id, dst): + def domain_migrate(self, id, dst, live): """Start domain migration. @param id: domain id @@ -597,7 +597,7 @@ class XendDomain: print 'domain_migrate>', id, dst dominfo = self.domain_lookup(id) xmigrate = XendMigrate.instance() - val = xmigrate.migrate_begin(dominfo.id, dst) + val = xmigrate.migrate_begin(dominfo.id, dst, live=live) print 'domain_migrate<', val return val diff --git a/tools/python/xen/xend/XendMigrate.py b/tools/python/xen/xend/XendMigrate.py index b98e5d87fc..de207aeb5c 100644 --- a/tools/python/xen/xend/XendMigrate.py +++ b/tools/python/xen/xend/XendMigrate.py @@ -259,7 +259,7 @@ class XendMigrateInfo(XfrdInfo): """Representation of a migrate in-progress and its interaction with xfrd. """ - def __init__(self, xid, dom, host, port): + def __init__(self, xid, dom, host, port, live): XfrdInfo.__init__(self) self.xid = xid self.state = 'begin' @@ -268,10 +268,14 @@ class XendMigrateInfo(XfrdInfo): self.dst_host = host self.dst_port = port self.dst_dom = None + self.live = live self.start = 0 def sxpr(self): - sxpr = ['migrate', ['id', self.xid], ['state', self.state] ] + sxpr = ['migrate', + ['id', self.xid ], + ['state', self.state ], + ['live', self.live ] ] sxpr_src = ['src', ['host', self.src_host], ['domain', self.src_dom] ] sxpr.append(sxpr_src) sxpr_dst = ['dst', ['host', self.dst_host] ] @@ -289,7 +293,8 @@ class XendMigrateInfo(XfrdInfo): self.src_dom, vmconfig, self.dst_host, - self.dst_port]) + self.dst_port, + self.live ]) def xfr_migrate_ok(self, xfrd, val): dom = int(sxp.child0(val)) @@ -410,7 +415,7 @@ class XendMigrate: reactor.connectTCP('localhost', XFRD_PORT, xcf) return info - def migrate_begin(self, dom, host, port=XFRD_PORT): + def migrate_begin(self, dom, host, port=XFRD_PORT, live=0): """Begin to migrate a domain to another host. @param dom: domain @@ -421,7 +426,7 @@ class XendMigrate: # Check dom for existence, not migrating already. # Subscribe to migrate notifications (for updating). xid = self.nextid() - info = XendMigrateInfo(xid, dom, host, port) + info = XendMigrateInfo(xid, dom, host, port, live) self.session_begin(info) return info.deferred diff --git a/tools/python/xen/xend/server/SrvDomain.py b/tools/python/xen/xend/server/SrvDomain.py index 50aa355e62..bdd57524ce 100644 --- a/tools/python/xen/xend/server/SrvDomain.py +++ b/tools/python/xen/xend/server/SrvDomain.py @@ -80,7 +80,8 @@ class SrvDomain(SrvDir): def op_migrate(self, op, req): fn = FormFn(self.xd.domain_migrate, [['dom', 'str'], - ['destination', 'str']]) + ['destination', 'str'], + ['live', 'int']]) deferred = fn(req.args, {'dom': self.dom.id}) print 'op_migrate>', deferred deferred.addCallback(self._op_migrate_cb, req) @@ -244,4 +245,5 @@ class SrvDomain(SrvDir): req.write('
' % url) req.write('
') req.write(' To host: ') + req.write('Live') req.write('
') diff --git a/tools/python/xen/xm/migrate.py b/tools/python/xen/xm/migrate.py index dd81aab0df..366fb5f694 100644 --- a/tools/python/xen/xm/migrate.py +++ b/tools/python/xen/xm/migrate.py @@ -22,6 +22,10 @@ gopts.opt('help', short='h', fn=set_true, default=0, use="Print this help.") +gopts.opt('live', short='l', + fn=set_true, default=0, + use="Use live migration.") + def help(argv): gopts.argv = argv gopts.usage() @@ -38,5 +42,5 @@ def main(argv): dst = args[1] if dom in [DOM0_NAME, DOM0_ID]: opts.err('Cannot migrate ' + dom) - server.xend_domain_migrate(dom, dst) + server.xend_domain_migrate(dom, dst, opts.vals.live) diff --git a/tools/xfrd/xen_domain.c b/tools/xfrd/xen_domain.c index 2f6d0fa8f2..5f4dcda506 100644 --- a/tools/xfrd/xen_domain.c +++ b/tools/xfrd/xen_domain.c @@ -53,7 +53,10 @@ void xcfini(void){ * At some point during this the domain is suspended, and then there's no way back. * Even if something later goes wrong we can't restart the domain. */ -int xen_domain_snd(Conn *xend, IOStream *io, uint32_t dom, char *vmconfig, int vmconfig_n){ +int xen_domain_snd(Conn *xend, IOStream *io, + uint32_t dom, + char *vmconfig, int vmconfig_n, + int live){ int err = 0; #ifdef _XEN_XFR_STUB_ char buf[1024]; @@ -89,7 +92,9 @@ int xen_domain_snd(Conn *xend, IOStream *io, uint32_t dom, char *vmconfig, int v ioctxt->suspend = domain_suspend; ioctxt->vmconfig = vmconfig; ioctxt->vmconfig_n = vmconfig_n; - + if(live){ + ioctxt->flags |= XCFLAGS_LIVE; + } err = xc_linux_save(xcinit(), ioctxt); #endif dprintf("< err=%d\n", err); diff --git a/tools/xfrd/xen_domain.h b/tools/xfrd/xen_domain.h index 4b2e1c7e04..2b59f502ee 100644 --- a/tools/xfrd/xen_domain.h +++ b/tools/xfrd/xen_domain.h @@ -7,7 +7,10 @@ /** Define to use stubs. Undefine to use Xen ops. */ //#define _XEN_XFR_STUB_ -extern int xen_domain_snd(Conn *xend, IOStream *io, uint32_t dom, char *vmconfig, int vmconfig_n); +extern int xen_domain_snd(Conn *xend, IOStream *io, + uint32_t dom, + char *vmconfig, int vmconfig_n, + int live); extern int xen_domain_rcv(IOStream *io, uint32_t *dom, char **vmconfig, int *vmconfig_n); diff --git a/tools/xfrd/xfrd.c b/tools/xfrd/xfrd.c index 5f3b4752bf..87fbac7bb5 100644 --- a/tools/xfrd/xfrd.c +++ b/tools/xfrd/xfrd.c @@ -81,7 +81,7 @@ receiver: (xfr.hello ) (xfr.err ) - xend->xfrd (xfr.migrate ) + xend->xfrd (xfr.migrate ) (xfr.save ) xfrd->xend (xfr.suspend ) xfrd->xend (xfr.progress ) @@ -95,7 +95,7 @@ receiver: Sxpr oxfr_configure; // (xfr.configure ) Sxpr oxfr_err; // (xfr.err ) Sxpr oxfr_hello; // (xfr.hello ) -Sxpr oxfr_migrate; // (xfr.migrate ) +Sxpr oxfr_migrate; // (xfr.migrate ) Sxpr oxfr_migrate_ok;// (xfr.migrate.ok ) Sxpr oxfr_progress; // (xfr.progress ) Sxpr oxfr_save; // (xfr.save ) @@ -235,6 +235,7 @@ typedef struct XfrState { unsigned long xfr_port; char *xfr_host; uint32_t vmid_new; + int live; } XfrState; /** Get the name of a transfer state. @@ -607,7 +608,9 @@ int xfr_send_state(XfrState *state, Conn *xend, Conn *peer){ if(err) goto exit; dprintf(">*** Sending domain %u\n", state->vmid); err = xen_domain_snd(xend, peer->out, - state->vmid, state->vmconfig, state->vmconfig_n); + state->vmid, + state->vmconfig, state->vmconfig_n, + state->live); dprintf(">*** Sent domain %u\n", state->vmid); if(err) goto exit; // Sending the domain suspends it, and there's no way back. @@ -752,7 +755,10 @@ int xfr_save(Args *args, XfrState *state, Conn *xend, char *file){ err = -EINVAL; goto exit; } - err = xen_domain_snd(xend, io, state->vmid, state->vmconfig, state->vmconfig_n); + err = xen_domain_snd(xend, io, + state->vmid, + state->vmconfig, state->vmconfig_n, + 0); if(err){ err = xfr_error(xend, err); } else { @@ -852,6 +858,8 @@ int xfrd_service(Args *args, int peersock, struct sockaddr_in peer_in){ if(err) goto exit; err = portof(sxpr_childN(sxpr, n++, ONONE), &port); if(err) goto exit; + err = intof(sxpr_childN(sxpr, n++, ONONE), &state->live); + if(err) goto exit; err = xfr_send(args, state, conn, addr, port); } else if(sxpr_elementp(sxpr, oxfr_save)){ -- 2.30.2